package com.example.pictureManage.util;

import com.example.pictureManage.FileNode;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.text.DecimalFormat;
import java.util.stream.Stream;

//文件工具类 方便重复使用
public class FileUtil {
    /*
    * @author 郑伯洋
    * @time 2025/2/5
    * @function 用于从路径中提取文件名称  作为工具类方便调用
    * */
    public static String getFileName(Path path) {
        String pathStr = path.toString();
        int lastSeparatorIndex = Math.max(pathStr.lastIndexOf('/'), pathStr.lastIndexOf('\\'));
        return pathStr.substring(lastSeparatorIndex + 1);
    }

    /*
     * @author 郑伯洋
     * @time 2025/2/5
     * @function 填充目录树
     * */
    public static void fillTree(Path path, FileNode treeItem) {
        try {
            Files.list(path)
                    .filter(Files::isDirectory) // 仅处理目录
                    .forEach(subPath -> {
                        FileNode child = new FileNode(FileUtil.getFileName(subPath), subPath);
                        treeItem.getChildren().add(child);
                        fillTree(subPath, child); // 递归遍历子目录
                    });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static boolean isImageFile(Path path) {
        String fileName = path.getFileName().toString();
        String fileExtension = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase();
        return fileExtension.equals("jpg") || fileExtension.equals("jpeg") || fileExtension.equals("png") ||
                fileExtension.equals("gif") || fileExtension.equals("bmp");
    }
    //item.getKey()
    /**
     * @param oldPathStr 文件的旧名字
     * @param userInput  文件的新名字   用户输入的
     * @param selectNum   选中的文件数
     * @param i  这是第几个文件？
     * */
    public static void reNameFiles(String oldPathStr,String userInput,int selectNum,int i){
        try {
            String root = oldPathStr;
            root = root.substring(
                    0, root.lastIndexOf('/')
            );
            //获取后缀名
            String behindStr = oldPathStr;
            behindStr = behindStr.substring(behindStr.lastIndexOf('.'));

            String newPathStr;
            //拼凑新文件路径
            if (selectNum == 1) {
                newPathStr = root + "/" + userInput + behindStr;
            } else {
                newPathStr = root + "/" + userInput + i + behindStr;
            }
            //旧路径
            Path oldPath = Paths.get(new URI(oldPathStr));

            Path newPath = Paths.get(new URI(newPathStr));

            //重命名
            Files.move(oldPath, newPath, StandardCopyOption.REPLACE_EXISTING);
        }
        catch (Exception ex){
            throw new RuntimeException(ex);
        }
    }

    public static String getDirDetail(Path path){
        File file = path.toFile();
        int fileNum = 0;
        double fileSize = 0;
        if (file.isDirectory()){
            File[] files = file.listFiles();
            if (files == null){
                return "目录下共有文件:0个,总大小: 0MB";
            }
            for (File item : files) {
                if (isImageFile(item.toPath())){
                    fileNum++;
                    fileSize+=item.length();
                }
            }
            fileSize /= (long) 1000_000.0;
            DecimalFormat decimalFormat = new DecimalFormat("#0.00");
            String resFileSize = decimalFormat.format(fileSize);
            return "目录下共有文件:"+fileNum+"个,总大小:"+resFileSize+"MB";
        }
        else{
            return "不是目录！也不是文件！";
        }
    }
        /**
     * 加载次级目录
     * @param fileNode 当前的父目录的
     */
    public static void loadDir(FileNode fileNode){
        Path path = fileNode.getFilePath();
        //已经加载过了非空
        if (!fileNode.getChildren().isEmpty() || !Files.isReadable(path)){
            return;
        }
        try(Stream<Path> stream = Files.list(fileNode.getFilePath())){

            stream.forEach(item -> {
                try {
                    //隐藏起来的目录就不要显示了
                    if (Files.exists(item)&&            //加载存在的目录
                            Files.isDirectory(item)&&  //只加载目录
                            !Files.isHidden(item)&&  //隐藏的不要加载
                            Files.isReadable(item)   //不要加载不能读的
                    ){
                        FileNode child = new FileNode(FileUtil.getFileName(item), item);
                        fileNode.getChildren().add(child);
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}
